package com.xky.example_student.service.impl;

import com.alibaba.druid.util.StringUtils;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xky.example_student.entity.Result;
import com.xky.example_student.entity.Student;
import com.xky.example_student.entity.User;
import com.xky.example_student.mapper.LoginMapper;
import com.xky.example_student.mapper.StudentMapper;
import com.xky.example_student.service.LoginService;
import com.xky.example_student.utils.PasswordEncoder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;


@Slf4j
@Service
public class LoginServiceImpl extends ServiceImpl<LoginMapper, User> implements LoginService {
    
    private final StudentMapper studentMapper;
    
    public LoginServiceImpl(StudentMapper studentMapper) {
        this.studentMapper = studentMapper;
    }
    @Override
    public Result<String> saveUser(User user) {
        String username = user.getUsername();
        String password = user.getPassword();
        String stuteaid = user.getStuteaid();
        String role = user.getRole();

        log.info("注册用户: username={}, stuteaid={}, role={}", username, stuteaid, role);

        // 对于非管理员用户，stuteaid（学号/工号）是必需的
        if (!"admin".equalsIgnoreCase(role)) {
            if (StringUtils.isEmpty(username)) {
                String roleText = "student".equalsIgnoreCase(role) ? "学号" : "工号";
                return Result.error(roleText + "不能为空");
            }
            
            // 验证学生身份
            if ("student".equalsIgnoreCase(role)) {
                try {
                    // 检查学号是否存在于学生表中
                    QueryWrapper<Student> studentWrapper = new QueryWrapper<>();
                    studentWrapper.eq("stu_id", Integer.parseInt(username));
                    if (studentMapper.selectCount(studentWrapper) == 0) {
                        return Result.error("该学号在学生信息中不存在，请确认学号是否正确");
                    }
                } catch (NumberFormatException e) {
                    return Result.error("学号格式不正确，请输入数字");
                }
            } else if ("teacher".equalsIgnoreCase(role)) {
                // 教师注册目前不检查教师表，允许直接注册
                // 如果需要检查教师表，可以在这里添加相应逻辑
                log.info("教师注册: 工号={}", username);
            }
            
            user.setStuteaid(username); // 使用输入的值作为学号/工号
            
            if (isStuIdExists(username)) {
                return Result.error("该学号/工号已注册账号");
            }
        } else {
            // 管理员用户需要验证用户名
            if (StringUtils.isEmpty(username)) {
                return Result.error("用户名不能为空");
            }
            if (isUsernameExists(username)) {
                return Result.error("用户名已存在");
            }
            // 管理员的stuteaid设置为0
            user.setStuteaid("0");
        }

        if (StringUtils.isEmpty(password)) {
            return Result.error("密码不能为空");
        }

        // 前端发送的已经是MD5加密后的密码，直接保存
        // user.setPassword(PasswordEncoder.encode(password));
        user.setPassword(password);
        
        // 设置创建和更新时间
        user.setCreateTime(LocalDateTime.now());
        user.setUpdateTime(LocalDateTime.now());
        
        // 设置默认编辑权限
        user.setCanEditProfile(true);

        try {
            log.info("保存用户到数据库: username={}, role={}", username, role);
            baseMapper.insert(user);

            return Result.success("注册成功");
        } catch (Exception e) {
            log.error("注册失败: ", e);
            return Result.error("注册失败: " + e.getMessage());
        }
    }

    @Override
    public User getUser(User user) {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        
        // 获取登录ID（可能是用户名或学号/工号）
        String loginId = user.getUsername();
        if (loginId == null || loginId.isEmpty()) {
            log.warn("登录ID为空");
            return null;
        }

        log.info("尝试登录: loginId={}", loginId);

        // 先尝试用学号/工号匹配（排除管理员的默认值0）
        wrapper.eq("stu_tea_id", loginId)
               .ne("stu_tea_id", "0");
        User found = baseMapper.selectOne(wrapper);
        
        if (found == null) {
            // 如果找不到，尝试用用户名匹配
            wrapper.clear();
            wrapper.eq("username", loginId);
            found = baseMapper.selectOne(wrapper);
        }
        
        if (found != null) {
            // 验证密码（前端发送的已经是MD5加密后的密码，直接比较）
            if (!user.getPassword().equals(found.getPassword())) {
                log.warn("密码不匹配");
                return null;
            }
            
            // 验证角色（如果指定了角色）
            if (user.getRole() != null && !user.getRole().isEmpty() 
                && !user.getRole().equalsIgnoreCase(found.getRole())) {
                log.warn("角色不匹配: 期望={}, 实际={}", user.getRole(), found.getRole());
                return null;
            }
            
            log.info("登录成功: ID={}, 角色={}", found.getId(), found.getRole());
        } else {
            log.info("未找到用户");
        }

        return found;
    }
    
    @Override
    public boolean isUsernameExists(String username) {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.eq("username", username);
        return baseMapper.selectCount(wrapper) > 0;
    }
    
    @Override
    public User getUserByUsername(String username) {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.eq("username", username);
        return baseMapper.selectOne(wrapper);
    }
    
    @Override
    public boolean isStuIdExists(String stuteaid) {
        if ("0".equals(stuteaid)) {
            return false; // 0是管理员的默认值，不应该被认为是已存在的学号/工号
        }
        try {
            QueryWrapper<User> wrapper = new QueryWrapper<>();
            // 将字符串转换为数字进行比较
            wrapper.eq("stu_tea_id", Long.parseLong(stuteaid));
            return baseMapper.selectCount(wrapper) > 0;
        } catch (NumberFormatException e) {
            log.warn("学号/工号格式错误: {}", stuteaid);
            return true; // 格式错误也认为已存在，阻止注册
        }
    }
}
